﻿namespace ConsoleApp2._1028;
 // 用户服务实现类：实现IUserService接口的所有方法
    public class UserServiceImpl : IUserService
    {
        // 用泛型集合List<User>存储所有用户（包括初始用户）
        private List<User> _users;

        // 构造函数：初始化用户集合，添加预设用户
        public UserServiceImpl()
        {
            _users = new List<User>();
            // 添加初始用户
            _users.Add(new User("admin", "Admin123"));
            _users.Add(new User("test", "Test456"));
        }

        // 显示主菜单
        public static void ShowMenu()
        {
            Console.WriteLine("\n===== 主菜单 =====");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 退出");
            Console.Write("请选择功能(1-3)：");
        }

        // 登录功能实现
        public void Login()
        {
            Console.WriteLine("\n===== 用户登录 =====");
            Console.Write("请输入用户名：");
            string username = Console.ReadLine()?.Trim();
            Console.Write("请输入密码：");
            string password = Console.ReadLine()?.Trim();

            // 空值验证
            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                Console.WriteLine("用户名或密码不可为空！");
                return;
            }

            bool isUserExist = false;
            bool isPasswordRight = false;

            // 用foreach循环遍历用户集合，验证用户名和密码
            foreach (User user in _users)
            {
                if (user.Username == username)
                {
                    isUserExist = true;
                    if (user.Password == password)
                    {
                        isPasswordRight = true;
                    }

                    break; // 找到对应用户后，跳出循环
                }
            }

            // 判断登录结果
            if (!isUserExist)
            {
                Console.WriteLine("登录失败：用户名不存在");
            }
            else if (!isPasswordRight)
            {
                Console.WriteLine("登录失败：密码错误");
            }
            else
            {
                Console.WriteLine($"登录成功！欢迎回来，{username}！");
                Console.WriteLine("===== 系统首页 =====");
            }
        }

        // 注册功能实现
        public void Regist()
        {
            Console.WriteLine("\n===== 用户注册 =====");
            Console.Write("请设置用户名：");
            string username = Console.ReadLine()?.Trim();
            Console.Write("请设置密码：");
            string password = Console.ReadLine()?.Trim();
            Console.Write("请确认密码：");
            string confirmPwd = Console.ReadLine()?.Trim();

            // 空值验证
            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(confirmPwd))
            {
                Console.WriteLine("输入不可为空！");
                return;
            }

            // 用户名长度验证（3-15个字符）
            if (username.Length < 3 || username.Length > 15)
            {
                Console.WriteLine("用户名长度必须为3-15个字符！");
                return;
            }

            // 用户名字符验证（只能包含字母、数字、下划线）
            foreach (char c in username)
            {
                if (!char.IsLetterOrDigit(c) && c != '_')
                {
                    Console.WriteLine("用户名只能包含字母、数字和下划线！");
                    return;
                }
            }

            // 用户名是否已存在（用foreach循环检查）
            foreach (User user in _users)
            {
                if (user.Username == username)
                {
                    Console.WriteLine("用户名已存在！");
                    return;
                }
            }

            // 密码长度验证（6-20个字符）
            if (password.Length < 6 || password.Length > 20)
            {
                Console.WriteLine("密码长度必须为6-20个字符！");
                return;
            }

            // 密码复杂度验证（至少1个大写、1个小写、1个数字）
            bool hasUpper = false;
            bool hasLower = false;
            bool hasDigit = false;

            foreach (char c in password)
            {
                if (char.IsUpper(c)) hasUpper = true;
                if (char.IsLower(c)) hasLower = true;
                if (char.IsDigit(c)) hasDigit = true;
            }

            if (!hasUpper || !hasLower || !hasDigit)
            {
                Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字！");
                return;
            }

            // 密码确认验证
            if (password != confirmPwd)
            {
                Console.WriteLine("两次输入的密码不一致！");
                return;
            }

            // 注册成功，添加到用户集合
            _users.Add(new User(username, password));
            Console.WriteLine("注册成功！已返回主菜单");
        }

        // 程序流程控制（循环显示菜单，处理用户选择）
        public  void Run()
        {
            bool isRunning = true;
            while (isRunning)
            {
                ShowMenu();
                string choice = Console.ReadLine()?.Trim();

                switch (choice)
                {
                    case "1":
                        Login();
                        break;
                    case "2":
                        Regist();
                        break;
                    case "3":
                        isRunning = false;
                        Console.WriteLine("谢谢使用，再见！");
                        break;
                    default:
                        Console.WriteLine("无效的选择，请重新输入！");
                        break;
                }
            }
        }
    }